import java.io.IOException;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
import org.apache.thrift.TProcessor;
import org.apache.thrift.protocol.TBinaryProtocol;
import org.apache.thrift.server.TServer;
import org.apache.thrift.server.THsHaServer;
import org.apache.thrift.transport.TNonblockingServerSocket;
import org.apache.thrift.transport.TTransportException;
import org.apache.thrift.async.AsyncMethodCallback;
public class AsyncServer {
private static AtomicInteger seq = new AtomicInteger(0);
private static class FloorQuoteReq {
public String symbol;
public AsyncMethodCallback callback;
public FloorQuoteReq(String s, AsyncMethodCallback amc) {
symbol = s;
callback = amc;
}
}
private static class FloorBroker implements Runnable {
private BlockingQueue<FloorQuoteReq> manualQuoteQ;
public FloorBroker() {
manualQuoteQ = new LinkedBlockingQueue<FloorQuoteReq>();
}
public BlockingQueue<FloorQuoteReq> getQ() { return manualQuoteQ; }
@Override
public void run() {
try {
while (true) {
FloorQuoteReq fqr = manualQuoteQ.take();
Thread.sleep(10000);
fqr.callback.onComplete(
new TradeReporting.TradeReport(fqr.symbol, 50.25, 1500,
seq.incrementAndGet()));
}
} catch (InterruptedException ex) {
System.out.println("[Server] Floor broker thread exiting");
}
}
}
public static class TradeHistoryHandler
implements TradeReporting.TradeHistory.Iface {
@Override
public TradeReporting.TradeReport get_last_sale(String symbol) {
return new TradeReporting.TradeReport(symbol, 76.50, 500,
seq.incrementAndGet());
}
}
private static class AsyncTradeHistoryHandler
implements TradeReporting.TradeHistory.AsyncIface {
private TradeHistoryHandler electronic;
private BlockingQueue<FloorQuoteReq> manual;
public AsyncTradeHistoryHandler(BlockingQueue<FloorQuoteReq> q) {
manual = q;
electronic = new TradeHistoryHandler();
}
@Override
public void get_last_sale(String symbol, AsyncMethodCallback callback)
throws org.apache.thrift.TException {
if (symbol.length() < 3) {
manual.add(new FloorQuoteReq(symbol, callback));
} else {
callback.onComplete(electronic.get_last_sale(symbol));
}
}
}
public static void main(String[] args)
throws TTransportException, IOException, InterruptedException {
FloorBroker floor = new FloorBroker();
(new Thread(floor)).start();
TProcessor proc = new TradeReporting.TradeHistory.AsyncProcessor(
new AsyncTradeHistoryHandler(floor.getQ()));
TNonblockingServerSocket trans_svr = new TNonblockingServerSocket(9090);
TServer server =
new THsHaServer(new THsHaServer.Args(trans_svr)
.processor(proc)
.protocolFactory(new TBinaryProtocol.Factory())
.minWorkerThreads(4)
.maxWorkerThreads(4));
System.out.println("[Server] listening of port 9090");
server.serve();
}
}